package com.junyou.utils.math;
/**
 * 位运算工具
 * @author LiuYu
 * @date 2014-12-29 下午6:52:52
 */
public class BitOperationUtil {
	
	/**
	 * 计算状态
	 * @param state	数据值
	 * @param index	判断第几位数据，有效范围0-30
	 * @return	
	 */
	@Deprecated
	public static Boolean calState(Integer state, Integer index){
		if(!state.equals(0)){
			return (state >> index & 1) == 0;
		}
		return true;
	}
	
	/**
	 * 改变状态，将指定为真
	 * @param state	数据原值
	 * @param index	改变第几位数据，有效范围0-30
	 * @return	改变后的数据
	 */
	@Deprecated
	public static Integer chanageState(Integer state, Integer index){
		return (1 << index) | state;
	}
	/**
	 * 改变状态，将指定为0|false
	 * @param state	数据原值
	 * @param index	改变第几位数据，有效范围0-30 
	 * 注意：index从1开始 !!!!!!!!!!
	 * @return	改变后的数据
	 */
	@Deprecated
	public static Integer chanageStateZero(Integer state, Integer index){
		return state & ~(1 << index-1);
	}
	
	//////////////////////////////新的方法//////////////////////////////////
	/**
	 * 检查正整数<code>state</code>的第<code>pos</code>位是否为1(真true=1;假false=0)
	 * @param state 满足Integer范围即可
	 * @param pos 范围[1,31]位:java中int基础数据类型4个字节=32位,但是实际表示数值的只有31位. 第一位用来表示符号,0=正数,1=负数,所以只有31位.
	 * @return true=1;false=0
	 * @throws:
	 * @Author: Yang Gao
	 * @date: 2016-12-7 下午3:50:50
	 */
	public static boolean checkBitT(int state, int pos) {
		return (state & (1 << pos - 1)) != 0;
	}
	/**
	 * 检查正整数<code>state</code>的第<code>pos</code>位是否为1(真true=1;假false=0)
	 * @param state 满足Integer范围即可
	 * @param pos 范围[1,31]位:java中int基础数据类型4个字节=32位,但是实际表示数值的只有31位. 第一位用来表示符号,0=正数,1=负数,所以只有31位.
	 * @return true=1;false=0
	 * @throws:
	 * @Author: Yang Gao
	 * @date: 2016-12-7 下午3:50:50
	 */
	public static boolean checkBitT0(int state, int pos) {
		return (state & (1 << pos)) != 0;
	}
	/**
	 * 将正整数<code>state</code>的第<code>pos</code>位的值设为1(真true=1;假false=0)
	 * @param state 满足Integer范围即可
	 * @param pos 范围[1,31]位(java中int基础数据类型4个字节=32位,但是实际表示数值的只有31位,第一位用来表示符号,0=正数,1= 负数,所以只有31位)
	 * @return 赋值后的<code>state</code>
	 * @throws:
	 * @Author: Yang Gao
	 * @date: 2016-12-7 下午3:21:41
	 */
	public static int setBitT(int state, int pos) {
		return state | (1 << (pos - 1));
	}
	
	/**
	 * 将正整数<code>state</code>的第<code>pos</code>位的值设为1(真true=1;假false=0)
	 * @param state 满足Integer范围即可
	 * @param pos 范围[1,31]位(java中int基础数据类型4个字节=32位,但是实际表示数值的只有31位,第一位用来表示符号,0=正数,1= 负数,所以只有31位)
	 * @return 赋值后的<code>state</code>
	 * @throws:
	 * @Author: Yang Gao
	 * @date: 2016-12-7 下午3:21:41
	 */
	public static int setBitT0(int state, int pos) {
		return state | (1 << (pos));
	}
	/**
	 * 将正整数<code>state</code>的第<code>pos</code>位的值设为0(真true=1;假false=0)
	 * @param state 满足Integer范围即可
	 * @param pos 范围[1,31]位(java中int基础数据类型4个字节=32位,但是实际表示数值的只有31位,第一位用来表示符号,0=正数,1= 负数,所以只有31位)
	 * @return 赋值后的<code>state</code>
	 * @throws:
	 * @Author: Yang Gao
	 * @date: 2016-12-7 下午3:21:41
	 */
	public static int setBitF(int state, int pos) {
		return state & (~(1 << (pos - 1)));
	}
	
    public static void main(String[] args) {
//		int state = 123456789;
//		int pos = 2;
//		int pos2 = 11;
//		System.out.println("state(10)=" + state + ", 除去首位的31位二进制数state(2)="+Integer.toBinaryString(state)+", pos=" + pos + ", 指定位数是否为(真)1?" + checkBitT(state, pos));
//		System.out.println("state(10)=" + state + ", 除去首位的31位二进制数state(2)="+Integer.toBinaryString(state)+", pos2=" + pos2 + ", 指定位数是否为(真)1?" + checkBitT(state, pos2));
    	int i = 0;
    	for(int j = 1; j <=31 ; j++){
    		i = setBitT(i, j);
    	}
    	System.out.println(i);
    	System.out.println(Integer.MAX_VALUE);
    	System.out.println(Integer.MIN_VALUE);
	}

}
